package cn.edu.sdjzu.knoverse.service;

import cn.edu.sdjzu.knoverse.model.dto.system.user.AdminUserAddDto;
import cn.edu.sdjzu.knoverse.model.dto.system.user.AdminUserDto;
import cn.edu.sdjzu.knoverse.model.dto.system.user.AdminUserUpdateByLocalUserDto;
import cn.edu.sdjzu.knoverse.model.dto.system.user.AdminUserUpdateDto;
import cn.edu.sdjzu.knoverse.model.dto.system.user.AdminUserUpdateUserStatusDto;
import cn.edu.sdjzu.knoverse.model.dto.system.user.AdminUserUpdateWithPasswordDto;
import cn.edu.sdjzu.knoverse.model.dto.system.user.LoginDto;
import cn.edu.sdjzu.knoverse.model.dto.system.user.UserPasswordUpdateDto;
import cn.edu.sdjzu.knoverse.model.dto.system.user.UserUpdateWithAvatarDto;
import cn.edu.sdjzu.knoverse.model.entity.system.User;
import cn.edu.sdjzu.knoverse.model.vo.result.PageResult;
import cn.edu.sdjzu.knoverse.model.vo.system.user.AdminUserVo;
import cn.edu.sdjzu.knoverse.model.vo.system.user.LoginVo;
import cn.edu.sdjzu.knoverse.model.vo.system.user.SearchUserinfoVo;
import cn.edu.sdjzu.knoverse.model.vo.system.user.UserVo;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import jakarta.validation.Valid;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.util.List;

public interface UserService extends IService<User> {
    
    /**
     * 前台用户登录接口
     *
     * @param loginDto 登录参数
     * @return 登录后结果返回
     */
    LoginVo login(LoginDto loginDto);

    /**
     * * 获取用户信息列表
     *
     * @return 用户信息返回列表
     */
    PageResult<AdminUserVo> getAdminUserList(Page<User> pageParams, AdminUserDto dto);

    /**
     * * 添加用户信息
     *
     * @param dto 添加表单
     */
    void addAdminUser(@Valid AdminUserAddDto dto);

    /**
     * * 更新用户信息
     *
     * @param dto 更新表单
     */
    void updateAdminUser(@Valid AdminUserUpdateDto dto);

    /**
     * * 删除|批量删除用户信息类型
     *
     * @param ids 删除id列表
     */
    void deleteAdminUser(List<Long> ids);

    /**
     * * 退出登录
     */
    void logout();

    /**
     * * 获取用户信息
     *
     * @param id 用户id
     * @return 用户信息
     */
    UserVo getUserinfoById(Long id);

    /**
     * * 管理员修改管理员用户密码
     *
     * @param dto 管理员用户修改密码
     */
    void updateUserPasswordByAdmin(AdminUserUpdateWithPasswordDto dto);

    /**
     * * 管理员上传用户头像
     *
     * @param dto 管理员用户修改头像
     */
    void uploadAvatarByAdmin(UserUpdateWithAvatarDto dto);

    /**
     * * 强制退出
     *
     * @param id 用户id
     */
    void forcedOffline(Long id);

    /**
     * * 查询用户
     *
     * @param keyword 查询用户信息关键字
     * @return 用户信息列表
     */
    List<SearchUserinfoVo> queryUser(String keyword);

    /**
     * * 修改用户状态
     *
     * @param dto 管理员用户修改密码
     */
    void updateUserStatusByAdmin(AdminUserUpdateUserStatusDto dto);

    /**
     * * 通过Excel导入用户
     *
     * @param file Excel文件
     * @param deptId 部门ID
     * @return 导入用户数量
     */
    int importUsersByExcel(MultipartFile file, Long deptId) throws IOException;

    /**
     * * 获取本地登录用户信息
     *
     * @return 用户信息
     */
    LoginVo getUserinfo();

    /**
     * * 更新本地用户信息
     *
     * @param dto 用户信息
     */
    void updateAdminUserByLocalUser(AdminUserUpdateByLocalUserDto dto);

    /**
     * * 更新本地用户密码
     *
     * @param dto 更新本地用户密码DTO
     */
    void updateUserPasswordByLocalUser(@Valid UserPasswordUpdateDto dto);
    
    /**
     * * 更新本地用户头像
     *
     * @param file 用户头像文件
     */
    void updateAvatarByLocalUser(MultipartFile file);

    /**
     * 获取用户信息
     * 
     * @param userId 用户ID
     * @return 用户信息，如果不存在则返回null
     */
    Object getUserInfo(Long userId);
}
